package com.atde._04_structural_design_patterns.flyweight.Integersrc;


/**
 * @BelongsProject: hsp_java_design_mode
 * @BelongsPackage: com.atde._04_structural_design_patterns.flyweight.Integersrc
 * @Author: Del
 * @CreateTime: 2025-06-23  15:53
 * @Description: 享元模式 --- Integer源码分析
 * @Version: 1.0
 */
public class IntegerSrcCode {
    public static void main(String[] args) {
        // 测试 Integer.valueOf() 和 new Integer() 的差异
        testIntegerComparison();
    }

    /**
     * 如果 Integer。valueOf(x)中 x 在 -128 到 127 之间，就是使用功享元模式返回，如果 x 不在 -128 到 127 之间，就会创建新的对象缓存池返回
     * 1. 在 valueOf方法中，先判断值是否在 IntegerCache中，如果不在，就创建新的Integer（new）, 否则，就直接从
     * 2. valueOf方法，就使用到了享元模式
     * 3. 如果使用valueOf方法得到一个 Integer 实例，范围在 -128 - 127， 执行速度比 new 快
     */

    public static void testIntegerComparison() {
        // 使用 Integer.valueOf() 创建（推荐方式，利用缓存）
        Integer x = Integer.valueOf(127);
        Integer y = new Integer(127); // 显式创建新对象（不推荐）
        Integer z = Integer.valueOf(127);
        Integer w = new Integer(127);

        // 打印哈希码（验证对象地址）
        System.out.println("Hash Codes:");
        System.out.println("x: " + System.identityHashCode(x));
        System.out.println("y: " + System.identityHashCode(y));
        System.out.println("z: " + System.identityHashCode(z));
        System.out.println("w: " + System.identityHashCode(w));

        // 比较测试
        System.out.println("\nComparison Results:");
        System.out.println("x.equals(y): " + x.equals(y));   // true（值相等）
        System.out.println("x == y:      " + (x == y));      // false（不同对象）
        System.out.println("x == z:      " + (x == z));      // true（缓存复用）
        System.out.println("w == x:      " + (w == x));      // false（不同对象）
        System.out.println("w == y:      " + (w == y));      // false（不同对象）

        // 测试缓存边界（JDK 默认缓存 -128~127）
        System.out.println("\nCache Boundary Test:");
        Integer cacheLow = Integer.valueOf(-128);
        Integer cacheHigh = Integer.valueOf(127);
        Integer outOfCache = Integer.valueOf(128);

        System.out.println("-128 == -128: " + (Integer.valueOf(-128) == cacheLow));      // true
        System.out.println("127 == 127:   " + (Integer.valueOf(127) == cacheHigh));      // true
        System.out.println("128 == 128:   " + (Integer.valueOf(128) == outOfCache));    // false
    }
}
